home *** CD-ROM | disk | FTP | other *** search
- (define (sort! x . y)
- (define test <=)
- (define (interchange x i j)
- (define tmp (vector-ref x i))
- (vector-set! x i (vector-ref x j))
- (vector-set! x j tmp))
- (define (qsort x m n)
- (if (< m n)
- (do ((i m)
- (j (1+ n))
- (k (begin (interchange x
- m
- (quotient (+ m n)
- 2))
- (vector-ref x m))))
- ((>= i j) (interchange x m j)
- (qsort x m (-1+ j))
- (qsort x (1+ j) n) x)
- (set! i (1+ i))
- (do ()
- ((or (test k (vector-ref x i))
- (>= i n)))
- (set! i (1+ i)))
- (set! j (-1+ j))
- (do ()
- ((or (test (vector-ref x j) k)
- (<= j m)))
- (set! j (-1+ j)))
- (if (< i j)
- (interchange x i j)))))
- (define (m-s x y)
- (define res (list 'dummy))
- (do ((ptr res (cdr ptr))
- (done #f))
- (done (cdr res))
- (cond ((null? x) (set-cdr! ptr y)
- (set! done #t))
- ((null? y) (set-cdr! ptr x)
- (set! done #t))
- ((test (car x) (car y))
- (set-cdr! ptr x)
- (set! x (cdr x)))
- (else (set-cdr! ptr y)
-
- (set! y (cdr y))))))
- (define (mer-so x)
- (if (or (null? x) (null? (cdr x)))
- x
- (m-s x
- (mer-so (do ((ptr (cdr x) (cdr ptr))
- (y (cddr x) (cdr y)))
- ((or (null? y)
- (test (car y) (car ptr)))
- (set-cdr! ptr nil) y))))))
- (if (pair? y)
- (if (proc? (car y))
- (set! test (car y))
- (error "second arg to sort! must be a procedure" (car y))))
- (cond ((vector? x) (qsort x 0 (-1+ (vector-length x))) x)
- ((pair? x) (mer-so x))
- (else (error "first arg to sort! must be a vector or a list" x))))
-
-